/*
 * GeneradorDeListadoDeDirectorio.cpp
 *
 *  Created on: 27/10/2011
 *      Author: putaro
 */

#include "GeneradorDeListadoDeDirectorio.h"
#include <iostream>
#include <dirent.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>

/*
 * Pre: El parámetro es la rutaOrigen del directorio dónde se encuentran los archivos
 * a indexar. El parámetro rutaDestino es el directorio donde se guardaran los
 * archivos generados para manejar el almacenamiento de las rutas recuperadas.
 * Ejemplo:
 * 	rutaOrigen: "/home" "./src" "./src/Directorio"
 * 	rutaDestino: "/home" "./src" "./src/Directorio"
 * Post: Se retorna la cantidad de rutas de documentos recuperadas del directorio.
*/
unsigned int GeneradorDeListadoDeDirectorio::generarListado(const string & rutaOrigen ,
													const string & rutaDestino) {
	unsigned int idDocumento = 0;
	ofstream principal;
	ofstream punteros;
	//armo ruta del principal e indice
	string rutaPrincipal = rutaDestino;
	string rutaPunteros = rutaDestino;
	rutaPrincipal.append("/");
	rutaPunteros.append("/");
	rutaPrincipal.append(NOMBRE_PRINCIPAL_RUTAS);
	rutaPunteros.append(NOMBRE_PUNTEROS_RUTAS);
	principal.open(rutaPrincipal.c_str());
	punteros.open(rutaPunteros.c_str(), ios::out | ios::binary);
	//recolección de rutas
	listarDirectorio(rutaOrigen, principal , punteros , idDocumento);
	principal.close();
	punteros.close();
	return idDocumento;
}

/*
 * Pre: El parámetro ruta es la ruta del directorio dónde se encuentran los archivos
 * a indexar. El parámetro principal esta asociado al archivo donde se guardan
 * las rutas encadenadas. El parámetro punteros esta asociado al archivo que
 * contiene las entradas para acceder a las rutas dadas por el número de documento.
 * Post: Se han recuperado las rutas del directorio y se han agregado al archivo
 * principal y se ha generado la entrada del archivo de punteros a ruta.
 * Si se ha agregado una ruta más se incrementa el parámetro idDocumento.
*/
void GeneradorDeListadoDeDirectorio::listarDirectorio(const string & ruta ,  ofstream &principal ,
										ofstream &punteros , unsigned int & idDocumento) {
	DIR *dir;
	struct dirent *mi_dirent;
	dir = opendir(ruta.c_str());
	if(dir != NULL) {
		mi_dirent = readdir(dir);
		while(mi_dirent != NULL) {
			if(strcmp(mi_dirent->d_name,"..") != 0){
				if(strcmp(mi_dirent->d_name,".") != 0){
					string rutaNueva(ruta + '/' + mi_dirent -> d_name);
					listarDirectorio(rutaNueva , principal, punteros , idDocumento);
				}
			}
			mi_dirent = readdir(dir);
		}
	} else {
		if( strstr((ruta.c_str()+ruta.length()-4),".txt") !=NULL){
			T_RegistroIndiceRutasDocumentos registro;
			registro.idDocumento = idDocumento;
			registro.longitudRuta = ruta.length();
			registro.puntero = principal.tellp();
			punteros.write(reinterpret_cast<char *>(&registro),sizeof(T_RegistroIndiceRutasDocumentos));
			principal<<ruta;
			idDocumento++;
		}
	}
	closedir(dir);
}
